# 设置项目所需的最低 CMake 版本。cmake_host_system_information 需要 3.10+。
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)

# 定义项目名称和使用的语言为 C++
project(recipe-13 LANGUAGES CXX)

# 添加一个可执行目标，名称为 "processor-info"。
# 初始时，源文件列表为空，稍后会添加。
add_executable(processor-info "")

# 添加 processor-info.cpp 作为目标的源文件。
# PRIVATE 关键字表示这个源文件仅用于构建 processor-info 目标本身。
target_sources(processor-info
  PRIVATE
      processor_info.cpp
  )

# 将 CMake 的二进制目录添加到 processor-info 目标的包含目录中。
# 生成的 config.h 文件将位于这个目录，这样 processor_info.cpp 才能找到它。
# PRIVATE 关键字表示这个包含目录仅用于编译 processor-info 目标本身。
target_include_directories(processor-info
  PRIVATE
       ${PROJECT_BINARY_DIR} # PROJECT_BINARY_DIR 是 CMake 内置变量，指向当前的构建目录
  )

# 查询主机系统的各种信息，并将结果存储在以 "_" 开头的变量中。
# cmake_host_system_information 命令用于查询运行 CMake 的主机的信息。
# RESULT 关键字指定了存储查询结果的变量前缀。
# QUERY 关键字后列出了要查询的信息类型。
foreach(key
  IN ITEMS
    NUMBER_OF_LOGICAL_CORES
    NUMBER_OF_PHYSICAL_CORES
    TOTAL_VIRTUAL_MEMORY
    AVAILABLE_VIRTUAL_MEMORY
    TOTAL_PHYSICAL_MEMORY
    AVAILABLE_PHYSICAL_MEMORY
    IS_64BIT
    HAS_FPU
    HAS_MMX
    HAS_MMX_PLUS
    HAS_SSE
    HAS_SSE2
    HAS_SSE_FP
    HAS_SSE_MMX
    HAS_AMD_3DNOW
    HAS_AMD_3DNOW_PLUS
    HAS_IA64
    OS_NAME
    OS_RELEASE
    OS_VERSION
    OS_PLATFORM
  )
  # 对于列表中的每个键，执行 cmake_host_system_information 查询，
  # 结果存储在变量 _<key> 中，例如 _NUMBER_OF_LOGICAL_CORES。
  cmake_host_system_information(RESULT _${key} QUERY ${key})
endforeach()

# 使用 configure_file 命令处理 config.h.in 模板文件。
# 它将读取 config.h.in，用相应的 CMake 变量值替换 @VAR@ 占位符，
# 并将结果写入到构建目录 (PROJECT_BINARY_DIR) 中的 config.h 文件。
# @ONLY 关键字确保只替换 @VAR@ 形式的占位符，忽略 ${VAR} 形式的占位符。
configure_file(config.h.in ${PROJECT_BINARY_DIR}/config.h @ONLY)
